<?php
/**
 * --------------------------------------------------------------
 * smarty 模板类
 * Author: zd <kfzphp@126.com>
 * Date: 2018-06-01
 * Project: kfzphp.com
 * --------------------------------------------------------------
 */

if(APP_DEBUG) {
    ini_set("display_errors", "On");
    error_reporting(E_ALL);
}

class KfzSmarty
{
    /**
     * 初始化
     */
    public function __construct($config)
    {
        $this->config = $config;
        $this->tpl = self::init();

    }

    /**
     * 初始化
     * @return [type] [description]
     */
    private function init()
    {
        if(!$this->config['TPL_STATUS']) {
            return false;
        }
        // 创建Smarty对象
        require_once VENDOR_PATH . '/smarty/Smarty.class.php';
        $smarty = new Smarty();
        // 默认模板目录的设置
        $smarty->template_dir = TEMPLATE_PATH . '/' . MODULE_NAME . '/';
        // 保存模板编译文件的目录名称
        $smarty->compile_dir =  COMPILE_PATH . '/' . MODULE_NAME . '/';
        // 设置存储 配置文件的目录
        $smarty->config_dir = CONFIG_PATH . '/';
        // 开启缓存
        // 让每个缓存的过期时间都可以在display执行前单独设置
        $cache_on = !empty($this->config['TPL_CACHE_ON']) ? Smarty::CACHING_LIFETIME_CURRENT : Smarty::CACHING_OFF;
        $smarty->setCaching($cache_on);
        // 设置缓存目录
        $smarty->setCacheDir(CACHE_PATH . '/' . MODULE_NAME . '/');
        // 开启时每次执行都重新缓存模板
        // 默认 false
        $smarty->force_cache = false;
        // 定义模板缓存文件的有效时间（按秒）
        // 当缓存过期了或模板文件发生修改，该缓存将被重新生成
        // -1，则设置缓存永不过期，只有当 force_cache 为 false 的时候有效
        $smarty->setCacheLifetime($this->config['TPL_CACHE_TIME']);
        // 开启时总是会重新生成缓存文件
        // 默认 false
        $smarty->force_compile = false;
        // 开启的时候，每个模板文件和配置文件都会在缓存检查的时候执行编译检查
        // 如果这些文件在缓存生成后被修改，那么缓存会马上重新生成
        // 默认 true
        $smarty->setCompileCheck(true);
        // 模板语法中的左限定符
        $smarty->left_delimiter = $this->config['TPL_L_DELIM'];
        // 模板语法中的右限定符
        $smarty->right_delimiter = $this->config['TPL_R_DELIM'];
        // Smarty将在编译目录和缓存目录下面创建子目录
        if($this->config['TPL_SUB_DIRS']) {
            $smarty->use_sub_dirs = true;
        }
        return $smarty;
    }

    /**
     * 模块赋值
     * @param  [type]     $key [description]
     * @param  [type]     $val [description]
     * @return [type]          [description]
     */
    public function show($key, $val)
    {
        $this->tpl->assign($key, $val);
    }

    /**
     * 显示模板
     * @param  [type] $cache_id   [缓存标识id]
     * @param  [type] $compile_id [编译标识id]
     * @param  string $html       [模板资源路径]
     * @return [type]             [description]
     */
    public function view($cache_id = null, $compile_id = null, $html = '')
    {
        // 网页字符编码
        if($this->config['HTTP_CONTENT_TYPE']) header('Content-Type:' . $this->config['HTTP_CONTENT_TYPE'] . '; charset=' . $this->config['HTTP_CHARSET']);
        if($this->config['HTTP_CACHE_CONTROL']) header('Cache-control: ' . $this->config['HTTP_CACHE_CONTROL']);  // 页面缓存控制
        if($this->config['HTTP_X_POWERED_BY']) header('X-Powered-By:' . $this->config['HTTP_X_POWERED_BY']);   //
        // 模块文件定义
        $tpl_filename = ucfirst(CONTROLLER_NAME) . '_' . ACTION_NAME;   // 模板前缀
        $tpl_suffix = $this->config['TPL_SUFFIX'] ? $this->config['TPL_SUFFIX'] : '.tpl';   // 模板后缀
        // 模板文件名称
        if(empty($html)) {
            $html = $tpl_filename . $tpl_suffix;
        }
        $this->tpl->display($html, $cache_id, $compile_id);
    }

    /**
     * 清除缓存
     * @param  [type] $cache_id   [缓存标识id]
     * @param  [type] $compile_id [编译标识id]
     * @param  string $html       [模板资源路径]
     * @return [type]             [description]
     */
    public function clear($cache_id = null, $compile_id = null, $html = '')
    {
        // 模块文件定义
        $tpl_filename = ucfirst(CONTROLLER_NAME) . '_' . ACTION_NAME;   // 模板前缀
        $tpl_suffix = $this->config['TPL_SUFFIX'] ? $this->config['TPL_SUFFIX'] : '.tpl';   // 模板后缀
        // 模板文件名称
        if(empty($html)) {
            $html = $tpl_filename . $tpl_suffix;
        }
        // 模块文件定义
        if($this->tpl->isCached($html, $cache_id, $compile_id)) {
            return $this->tpl->clearCache($html, $cache_id, $compile_id);
        }
    }

}